/**
 * @(#)RegistroEmpleadoK.java Feb 20, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : Psique
 * <br/>Creaci&oacute;n: Feb 20, 2007 - 1:20:55 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Feb 20, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.modelo;

import com.psiqueware.alheli.basico.BaseObject;
import com.psiqueware.alheli.exception.NullArgumentException;
import com.psiqueware.jazmin.empresas.recursos.humanos.Asignacion;
import com.psiqueware.jazmin.empresas.recursos.humanos.Empleado;
import com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.EstructuraSalarial;
import com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.IncrementoPropuesto;
import com.psiqueware.jazmin.empresas.recursos.humanos.compensaciones.RegistroEmpleado;

import java.util.Date;

/**
 * Registro de las compensaciones para una {@link Asignacion} de un {@link Empleado} dada.
 * <br/>Paquete Original: com.psiqueware.laVIE.empresas.empleados.compensaciones.modelo
 * <br/>Nombre  Original: RegistroEmpleadoK
 * <br/>Oprima para ver : <a href="RegistroEmpleadoK.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Psique</a>
 * @version Revision: 1.1 Feb 20, 2007 1:20:55 PM
 * @noinspection ClassWithoutLogger
 */
public class RegistroEmpleadoK extends BaseObject implements RegistroEmpleado
{

    /**
     * {@link Empleado} al que pertenece este {@link RegistroEmpleado}.
     * Se tiene por conveniencia; esta informaci&oacute;n ya esta en la asignaci&oacute;n.
     */
    private Empleado m_empleado;

    /** {@link Asignacion} con los datos de identificacion para este {@link RegistroEmpleado}. */
    private Asignacion m_asignacion;

    /** Incremento propuesto por el {@link Empleado} de {@link Cargo} superior a este {@link Empleado}. */
    private IncrementoPropuesto m_aumentoGerente;

    /** Incremento propuesto autom&aacute;ticamente por el sistema. */
    private IncrementoPropuesto m_aumentoSistema;

    /**
     * Incremento elegido. Puede no coincidir con ninguno de los anteriores si alguien de {@link Cargo} superior
     * al {@link Empleado} gerente cambia los datos.
     */
    private IncrementoPropuesto m_aumentoFinal;

    /**
     * Es el calculo de meses entre la fecha de incrementos
     * y la fecha asignacion del sueldo reciente.
     * Por ejemplo, mi sueldo desde Julio 2006 es de 10mil y la razon
     * es por contratacion. La proxima fecha de incrementos es Marzo 2007
     * por lo tanto, tendre en Marzo 2007 8 meses sin incremento
     */
    private Integer m_mesesSinIncremento;

    /** {@link EstructuraSalarial} bajo la cual se le paga al {@link Empleado} en dicha {@link Asignacion}. */
    private EstructuraSalarial m_estructuraSalarial;


    /** Fecha del &uacute;ltimo aumento de {@link Sueldo} del {@link Empleado}. */
    private Date m_ultimoAumento;

    /** Fecha a partir de la cual este {@link RegistroEmpleado} ya no puede ser modificado. */
    private Date m_cierreRegistro;

    /** Constructor de RegistroEmpleadoK. */
    public RegistroEmpleadoK ()
    {
    }

    public RegistroEmpleadoK ( final RegistroEmpleado ultimo, final Asignacion asignacion, final EstructuraSalarial estructuraSalarial )
    {
        if ( null == asignacion ) throw new NullArgumentException ( "<error>El argumento 'asignacion' no puede ser NULL.</error>" );
        if ( null == asignacion.getEmpleado () ) throw new NullArgumentException( "<error>El argumento 'asignacion.getEmpleado ()' no puede ser NULL.</error>" );

        m_empleado = asignacion.getEmpleado ();
        m_estructuraSalarial = estructuraSalarial;
        m_asignacion = asignacion;

        //ponemos la fecha de registro
        if ( null != ultimo )
        {
            m_ultimoAumento = ultimo.getCierreRegistro ();
        }
        else
        {
            if ( null == m_empleado.getContrato ().getFechaIngreso () ) throw new NullArgumentException ( "<error>El argumento 'm_empleado.getContrato ().getFechaIngreso ()' no puede ser NULL.</error>" );
            m_ultimoAumento = m_empleado.getContrato ().getFechaIngreso ();
        }

    }

    /**
     * Realiza una comparaci&oacute;n de este objeto contra otro a fin de
     * realizar una ordenaci&oacute;n natural. De ser necesario alterar el
     * orden de objetos se factible sobrecargar este m&eacute;todo.
     *
     * @noinspection MethodWithMultipleReturnPoints,AccessingNonPublicFieldOfAnotherObject,CastToConcreteClass
     * @see Comparable#compareTo
     */
    @Override
    public int compareTo ( final Object o )
    {
        RegistroEmpleadoK oK = ( RegistroEmpleadoK ) o;
        final int salida;
        if ( this.m_cierreRegistro != null && oK.m_cierreRegistro != null )
        {
            salida = this.m_cierreRegistro.compareTo ( oK.m_cierreRegistro );
        }
        else
        {
            salida = m_cierreRegistro == null ? -1 : 1;
        }
        return salida;
    }


    /**
     * Devuelve el Es el calculo de meses entre la fecha de incrementos
     * y la fecha asignacion del sueldo reciente.
     * Por ejemplo, mi sueldo desde Julio 2006 es de 10mil y la razon
     * es por contratacion. La proxima fecha de incrementos es Marzo 2007
     * por lo tanto, tendre en Marzo 2007 8 meses sin incremento
     *
     * @return valor de 'mesesSinIncremento'.
     *
     * @see Integer
     */
    public Integer getMesesSinIncremento ()
    {
        return m_mesesSinIncremento;
    }

    /**
     * Establece el Es el calculo de meses entre la fecha de incrementos
     * y la fecha asignacion del sueldo reciente.
     * Por ejemplo, mi sueldo desde Julio 2006 es de 10mil y la razon
     * es por contratacion. La proxima fecha de incrementos es Marzo 2007
     * por lo tanto, tendre en Marzo 2007 8 meses sin incremento
     *
     * @param mesesSinIncremento nuevo valor para 'mesesSinIncremento'.
     *
     * @see Integer
     */
    public void setMesesSinIncremento ( final Integer mesesSinIncremento )
    {
        m_mesesSinIncremento = mesesSinIncremento;
    }

    /**
     * Devuelve el Incremento elegido. Puede no coincidir con ninguno de los anteriores si alguien de {@link Cargo} superior
     * al {@link Empleado} gerente cambia los datos.
     *
     * @return valor de 'aumentoFinal'.
     *
     * @see IncrementoPropuestoK
     */
    public IncrementoPropuesto getAumentoFinal ()
    {
        return m_aumentoFinal;
    }

    /**
     * Establece el Incremento elegido. Puede no coincidir con ninguno de los anteriores si alguien de {@link Cargo} superior
     * al {@link Empleado} gerente cambia los datos.
     *
     * @param aumentoFinal nuevo valor para 'aumentoFinal'.
     *
     * @see IncrementoPropuestoK
     */
    public void setAumentoFinal ( final IncrementoPropuesto aumentoFinal )
    {
        m_aumentoFinal = aumentoFinal;
    }

    /**
     * Devuelve el Incremento propuesto autom&aacute;ticamente por el sistema.
     *
     * @return valor de 'aumentoSistema'.
     *
     * @see IncrementoPropuestoK
     */
    public IncrementoPropuesto getAumentoSistema ()
    {
        return m_aumentoSistema;
    }

    /**
     * Establece el Incremento propuesto autom&aacute;ticamente por el sistema.
     *
     * @param aumentoSistema nuevo valor para 'aumentoSistema'.
     *
     * @see IncrementoPropuestoK
     */
    public void setAumentoSistema ( final IncrementoPropuesto aumentoSistema )
    {
        m_aumentoSistema = aumentoSistema;
    }

    /**
     * Devuelve el Incremento propuesto por el {@link Empleado} de {@link Cargo} superior a este {@link Empleado}.
     *
     * @return valor de 'aumentoGerente'.
     *
     * @see IncrementoPropuestoK
     */
    public IncrementoPropuesto getAumentoGerente ()
    {
        return m_aumentoGerente;
    }

    /**
     * Establece el Incremento propuesto por el {@link Empleado} de {@link Cargo} superior a este {@link Empleado}.
     *
     * @param aumentoGerente nuevo valor para 'aumentoGerente'.
     *
     * @see IncrementoPropuestoK
     */
    public void setAumentoGerente ( final IncrementoPropuesto aumentoGerente )
    {
        m_aumentoGerente = aumentoGerente;
    }


    /**
     * Devuelve el {@link Asignacion} con los datos de identificacion para este {@link RegistroEmpleado}.
     *
     * @return valor de 'asignacion'.
     *
     * @see Asignacion
     */
    public Asignacion getAsignacion ()
    {
        return m_asignacion;
    }

    /**
     * Establece el {@link Asignacion} con los datos de identificacion para este {@link RegistroEmpleado}.
     *
     * @param asignacion nuevo valor para 'asignacion'.
     *
     * @see Asignacion
     */
    public void setAsignacion ( final Asignacion asignacion )
    {
        m_asignacion = asignacion;
    }


    /**
     * Devuelve el {@link EstructuraSalarial} bajo la cual se le paga al {@link Empleado} en dicha {@link Asignacion}.
     *
     * @return valor de 'estructuraSalarial'.
     *
     * @see EstructuraSalarial
     */
    public EstructuraSalarial getEstructuraSalarial ()
    {
        return m_estructuraSalarial;
    }

    /**
     * Establece el {@link EstructuraSalarial} bajo la cual se le paga al {@link Empleado} en dicha {@link Asignacion}.
     *
     * @param estructuraSalarial nuevo valor para 'estructuraSalarial'.
     *
     * @see EstructuraSalarial
     */
    public void setEstructuraSalarial ( final EstructuraSalarial estructuraSalarial )
    {
        m_estructuraSalarial = estructuraSalarial;
    }

    /**
     * Devuelve el Fecha del &uacute;ltimo aumento de {@link Sueldo} del {@link Empleado}.
     *
     * @return valor de 'ultimoAumento'.
     *
     * @see Date
     */
    public Date getUltimoAumento ()
    {
        Date salida = null;
        if ( null != m_ultimoAumento )
        {
            salida = new Date ( m_ultimoAumento.getTime () );
        }
        return salida;
    }

    /**
     * Establece el Fecha del &uacute;ltimo aumento de {@link Sueldo} del {@link Empleado}.
     *
     * @param ultimoAumento nuevo valor para 'ultimoAumento'.
     *
     * @see Date
     */
    public void setUltimoAumento ( final Date ultimoAumento )
    {
        Date salida = null;
        if ( null != ultimoAumento )
        {
            salida = new Date ( ultimoAumento.getTime () );
        }
        this.m_ultimoAumento = salida;
    }


    /**
     * Devuelve el Fecha a partir de la cual este {@link RegistroEmpleado} ya no puede ser modificado.
     *
     * @return valor de 'cierreRegistro'.
     *
     * @see Date
     */
    public Date getCierreRegistro ()
    {
        Date salida = null;
        if ( null != m_cierreRegistro )
        {
            salida = new Date ( m_cierreRegistro.getTime () );
        }
        return salida;
    }

    /**
     * Establece el Fecha a partir de la cual este {@link RegistroEmpleado} ya no puede ser modificado.
     *
     * @param cierreRegistro nuevo valor para 'cierreRegistro'.
     *
     * @see Date
     */
    public void setCierreRegistro ( final Date cierreRegistro )
    {
        Date salida = null;
        if ( null != cierreRegistro )
        {
            salida = new Date ( cierreRegistro.getTime () );
        }
        this.m_cierreRegistro = salida;

    }

    /**
     * Convierte este {@link RegistroEmpleado} a su representación textual.
     *
     * @noinspection DuplicateStringLiteralInspection,HardCodedStringLiteral,HardcodedLineSeparator
     */
    public String toString ()
    {
        StringBuilder sb = new StringBuilder ();
        sb.append ( "<Instance Class = '" ).append ( this.getClass ().getCanonicalName () ).append ( "'>" );
        sb.append ( "<asignacion>" ).append ( m_asignacion ).append ( "</asignacion> " );
        sb.append ( "<aumentoGerente>" ).append ( m_aumentoGerente ).append ( "</aumentoGerente> " );
        sb.append ( "<aumentoSistema>" ).append ( m_aumentoSistema ).append ( "</aumentoSistema> " );
        sb.append ( "<aumentoFinal>" ).append ( m_aumentoFinal ).append ( "</aumentoFinal> " );
        sb.append ( "<mesesSinIncremento>" ).append ( m_mesesSinIncremento ).append ( "</mesesSinIncremento> " );
        sb.append ( "<estructuraSalarial>" ).append ( m_estructuraSalarial ).append ( "</estructuraSalarial> " );
        sb.append ( "<ultimoAumento>" ).append ( m_ultimoAumento ).append ( "</ultimoAumento> " );
        sb.append ( "<cierreRegistro>" ).append ( m_cierreRegistro ).append ( "</cierreRegistro> " );
        sb.append ( "</Instance>" );
        return sb.toString ();
    }

    /**
     * Devuelve el {@link Empleado} al que pertenece este {@link RegistroEmpleado}.
     * Se tiene por conveniencia.
     *
     * @return valor de 'empleado'.
     *
     * @see Empleado
     */
    public Empleado getEmpleado ()
    {
        return m_empleado;
    }

}

